﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace FrbaCommerce.Generar_Publicacion
{
    public partial class frm_generarPublicacion : Form
    {
        public frm_generarPublicacion()
        {
            InitializeComponent();
        }

        private void GenerarPublicacion_Load(object sender, EventArgs e)
        {
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "LOS_GDDES.SP_TRAER_TIPO_PUBLICACION";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            DataTable dt_tiposPublicacion = baseDeDatos.consulta(sqlCommand);
            cmb_tipoPublicacion.DataSource = dt_tiposPublicacion;
            cmb_tipoPublicacion.DisplayMember = "DESCRIPCION";
            cmb_tipoPublicacion.ValueMember = "ID_TIPO_PUBLICACION";

            sqlCommand.CommandText = "LOS_GDDES.SP_TRAER_RUBROS";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            DataTable dt_rubros = baseDeDatos.consulta(sqlCommand);
            clb_rubros.DataSource = dt_rubros;
            clb_rubros.DisplayMember = "DESCRIPCION";
            clb_rubros.ValueMember = "ID_RUBRO";

            sqlCommand.CommandText = "LOS_GDDES.SP_TRAER_VISIBILIDADES";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            DataTable dt_visibilidades = baseDeDatos.consulta(sqlCommand);
            cmb_visibPublicacion.DataSource = dt_visibilidades;
            cmb_visibPublicacion.DisplayMember = "DESCRIPCION";
            cmb_visibPublicacion.ValueMember = "ID_VISIBILIDAD";
            cmb_visibPublicacion.SelectedValue = 5;

            sqlCommand.CommandText = "LOS_GDDES.SP_TRAER_ESTADOS";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            DataTable dt_estados = baseDeDatos.consulta(sqlCommand);
            cmb_estadoPublicacion.DataSource = dt_estados;
            cmb_estadoPublicacion.DisplayMember = "DESCRIPCION";
            cmb_estadoPublicacion.ValueMember = "ID_ESTADO";
            rdb_si.Checked = true;
        }
        
        private void cmb_tipoPublicacion_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(cmb_tipoPublicacion.Text == "Subasta")
            {
                nud_stock.Enabled = false;
                nud_stock.Value = 1;
            }
            else
            {
                nud_stock.Enabled = true;
            }
        }

        private void cmb_visibPublicacion_SelectionChangeCommitted(object sender, EventArgs e)
        {
            validar_publicaciones_gratuitas();
        }
        
        private int validar_publicaciones_gratuitas()
        {
            if (Convert.ToInt32(cmb_visibPublicacion.SelectedValue) == 1 && Convert.ToInt32(cmb_estadoPublicacion.SelectedValue) == 1)
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_PUBLICACIONES_GRATUITAS";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@id_usuario", BaseDeDatos.Instance.idUsuario);
                sqlCommand.Parameters.AddWithValue("@id_rol", BaseDeDatos.Instance.idRol);
                int cantGratis = baseDeDatos.ejecuta(sqlCommand);

                if (cantGratis >= 3)
                    return 0;
                else
                    return 1;
            }

            return 1;
        }

        private void btn_cancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btn_aceptar_Click(object sender, EventArgs e)
        {
            if ((txt_descripPublicacion.Text != "") & (txt_precioPublicacion.Text != ""))
            {
                if (clb_rubros.CheckedItems.Count != 0)
                {
                    int valido = validar_publicaciones_gratuitas();
                    if (valido == 1)
                    {
                        BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                        SqlCommand sqlCommand = new SqlCommand();
                        sqlCommand.CommandText = "LOS_GDDES.SP_INSERTAR_PUBLICACION";
                        sqlCommand.CommandType = CommandType.StoredProcedure;
                        sqlCommand.Parameters.AddWithValue("id_usuario", baseDeDatos.idUsuario);
                        sqlCommand.Parameters.AddWithValue("id_rol", baseDeDatos.idRol);
                        sqlCommand.Parameters.AddWithValue("descripcion", txt_descripPublicacion.Text);
                        sqlCommand.Parameters.AddWithValue("stock", nud_stock.Value);
                        sqlCommand.Parameters.AddWithValue("fecha_inicio", Convert.ToDateTime(Properties.Settings.Default.FechaDelSistema));
                        sqlCommand.Parameters.AddWithValue("precio", Convert.ToDecimal(txt_precioPublicacion.Text));
                        sqlCommand.Parameters.AddWithValue("id_visibilidad", cmb_visibPublicacion.SelectedValue);
                        sqlCommand.Parameters.AddWithValue("id_estado", cmb_estadoPublicacion.SelectedValue);
                        sqlCommand.Parameters.AddWithValue("id_tipo_publicacion", cmb_tipoPublicacion.SelectedValue);

                        if (rdb_si.Checked)
                            sqlCommand.Parameters.AddWithValue("permite_preguntas", true);
                        if (rdb_no.Checked)
                            sqlCommand.Parameters.AddWithValue("permite_preguntas", false);
                        int idPublicacion = baseDeDatos.ejecuta(sqlCommand);
                        sqlCommand.CommandText = "LOS_GDDES.SP_INSERTAR_RUBRO_X_PUBLIACION";
                        sqlCommand.CommandType = CommandType.StoredProcedure;

                        foreach (DataRowView rubro in clb_rubros.CheckedItems)
                        {
                            sqlCommand.Parameters.Clear();
                            sqlCommand.Parameters.AddWithValue("id_publicacion", idPublicacion);
                            sqlCommand.Parameters.AddWithValue("id_rubro", rubro.Row.Field<Decimal>("ID_RUBRO"));
                            baseDeDatos.ejecuta(sqlCommand);
                        }
                        if (Convert.ToInt16( cmb_estadoPublicacion.SelectedValue)!=2){
                            insertar_item_factura_publicacion(idPublicacion);
                        }
                        MessageBox.Show("Publicación generada. ¡Éxitos con la venta!");
                        this.Close();
                    }
                    else
                    {
                        MessageBox.Show("No se puede generar la publicación. Alcanzó el máximo de publicaciones gratuitas.");
                    }
                }
                else
                {
                    MessageBox.Show("Debe seleccionar al menos un rubro.");
                }
            }
            else
            {
                MessageBox.Show("Faltan completar datos.");
            }
        }

        private void insertar_item_factura_publicacion(int id_publicacion)
        {
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "LOS_GDDES.INSERTAR_ITEM_FACTURA_X_PUBLICACION";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.Parameters.AddWithValue("@id_publicacion", id_publicacion);
            sqlCommand.Parameters.AddWithValue("@fecha_creacion", Convert.ToDateTime(Properties.Settings.Default.FechaDelSistema));
            
            baseDeDatos.ejecuta(sqlCommand);
        }

        private void txt_precioPublicacion_KeyPress_1(object sender, KeyPressEventArgs e)
        {
            if (!char.IsControl(e.KeyChar)
                && !char.IsDigit(e.KeyChar)
                && e.KeyChar != ',')
            {
                e.Handled = true;
            }

            // only allow one decimal point
            if (e.KeyChar == ','
                && (sender as TextBox).Text.IndexOf(',') > -1)
            {
                e.Handled = true;
            }
        }   
    }
}
